iT邦幫忙

0

在Hangfire JobFilter取得當前Job LifetimeScope

miy 2019-06-24 11:34:451266 瀏覽
  • 分享至 

  • xImage
  •  

以Autofac為例

建立自訂的排程 JobActivator

GetChildScope() 建立新的子生命週期寫入私有欄位,並返回

    /// <summary>
    /// 排程Ioc容器解析器
    /// </summary>
    public class ContainerJobActivator : JobActivator
    {
        /// <summary>
        /// 父容器
        /// </summary>
        public readonly IContainer Container;

        /// <summary>
        /// 容器物件子生命週期
        /// </summary>
        [ThreadStatic]
        private static ILifetimeScope ChildScope;

        /// <summary>
        /// 建構式
        /// </summary>
        /// <param name="container">父容器</param>
        public ContainerJobActivator(IContainer container)
        {
            this.Container = container;
        }

        /// <summary>
        /// 解析物件為實體
        /// </summary>
        /// <param name="jobType">物件類型</param>
        /// <returns>物件實體</returns>
        public override object ActivateJob(Type jobType)
        {
            return ChildScope.Resolve(jobType);
        }

        /// <summary>
        /// 取得容器物件子生命週期
        /// </summary>
        /// <returns>容器物件子生命週期</returns>
        public ILifetimeScope GetChildScope()
        {
            ChildScope = Container.BeginLifetimeScope();
            return ChildScope;
        }

        /// <summary>
        /// 釋放容器物件子生命週期
        /// </summary>
        public void DisposeChildScope()
        {
            ChildScope.Dispose();
            ChildScope = null;
        }
    }

建立自訂排程Filter

建構式傳入建立好的 JobActivator 實體

this.ContainerJobActivator.GetChildScope(),取出當前排程之LifetimeScope()

 /// <summary>
    /// 排程訊息推播註冊
    /// </summary>
    public class ObserverJobFilterAttribute : JobFilterAttribute, IServerFilter
    {
        /// <summary>
        /// 排程Ioc容器解析物件
        /// </summary>
        private readonly ContainerJobActivator ContainerJobActivator;

        /// <summary>
        /// 建構式
        /// </summary>
        /// <param name="container">排程Ioc容器</param>
        public ObserverJobFilterAttribute(ContainerJobActivator container)
        {
            this.ContainerJobActivator = container;
        }

        /// <summary>
        /// 排程處理結束事件
        /// </summary>
        /// <param name="filterContext">filterContext</param>
        public void OnPerformed(PerformedContext filterContext)
        {
            this.ContainerJobActivator.DisposeChildScope();
        }

        /// <summary>
        /// 排程處理開始事件
        /// </summary>
        /// <param name="filterContext">filterContext</param>
        public void OnPerforming(PerformingContext filterContext)
        {
            ILifetimeScope currentLifetimeScope = this.ContainerJobActivator.GetChildScope();
        }
    }

將hangfire納入autofac管理

選用自訂的容器解析器 containerJobActivator

加入filter

         GlobalConfiguration.Configuration.UseAutofacActivator(container);

         ContainerJobActivator containerJobActivator = new ContainerJobActivator(container);
         JobActivator.Current = containerJobActivator;

         GlobalJobFilters.Filters.Add(new ObserverJobFilterAttribute(containerJobActivator));

/images/emoticon/emoticon02.gif


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言